import random, logging
from django.shortcuts import render
from django.views import View
from verifications.libs.captcha.captcha import captcha
from django_redis import get_redis_connection
from django import http
from . import constants
from shop.utils.response_code import RETCODE
from verifications.libs.yuntongxun.ccp_sms import CCP
from celery_tasks.sms.tasks import send_sms_code

logger = logging.getLogger('django')

class ImageCodeView(View):
    #获取图像验证码
    def get(self,request,uuid):
        #uuid，表示每个用户独属于的验证码标识
        #校验 - 生成图像验证码 - 保存 - 响应图形验证码
        
        #captcha返回两个结果，第一个是文字第二个是图片
        text, image = captcha.generate_captcha()
        
        #将结果保存在redis中,使用django-redis
        redis_con = get_redis_connection('verification_code')
        #设置key为img_uuid,过期时间为300s,value为text
        redis_con.setex('img_%s' % uuid,constants.IMAGE_CODE_REDIS_EXPIRES,text)
        
        #响应结果
        #HttpResponse('响应体','响应类型')
        return http.HttpResponse(image,content_type='image/jpg')
    
class SmsCodeView(View):
    def get(self,request,mobile):
        #获取参数，一个是网页输入的图形验证码信息，一个是前端生成的唯一标识uuid
        image_code_client = request.GET.get('image_code')
        uuid = request.GET.get('uuid')
        #校验参数
        if not all([image_code_client,uuid]):
            return http.HttpResponseForbidden('缺少必要参数')
        #提取图形验证码
        redis_con = get_redis_connection('verification_code')
        #python3    redis取出数据也是bytes
        image_code_server = redis_con.get('img_%s' % uuid)
        #判断是否过期
        if image_code_server is None:
            return http.JsonResponse(
                {
                    'code': RETCODE.IMAGECODEERR,
                    'errmsg': '图形验证码失效'
                }
            )
        #删除图形验证码
        redis_con.delete('img_%s' % uuid)
        #对比图形验证码，将image_code_server从bytes类型转换成string类型
        image_code_server = image_code_server.decode()
        #都转小写优化体验
        if image_code_client.lower() != image_code_server.lower():
            return http.JsonResponse(
                {
                    'code': RETCODE.IMAGECODEERR,
                    'errmsg': '输入图形验证码有误'
                }
            )
        #生成短信验证码,不满足四位在前面加0
        sms_code = '%04d' % random.randint(0,9999)
        logger.info(sms_code)
        
        #保存短信验证码
        redis_con.setex('sms_%s' % mobile,constants.SMS_CODE_REDIS_EXPIRES,sms_code)
        #发送短信验证码
        # CCP().send_message(1,mobile,(sms_code,5))
        
        #改为celery异步发送，解决点击发送，不立即响应结果的问题，delay别忘
        send_sms_code.delay(mobile,sms_code)
        
        return http.JsonResponse(
                {
                    'code': RETCODE.OK,
                    'errmsg': '图形验证码验证通过，短信验证码发送成功'
                }
            )

        
        
        